/**

* 基于layui.layer自定义组件：

* loadPage()    :   加载页面

* ajaxSubmit()  :   AJAX提交

*/



layui.define(['layer', 'laypage', 'laytpl', 'form'], function(exports) {

    var obj = {

        // ajax导入页面

        // 输入参数: options 对象

        // * url   : AJAX请求地址

        // * title : 页面标题

        // * area  : 大小，例如['100px','100px']



        loadPage: function(options) {

            options = options || {};

            layer_options = {

                type: 1,

                title: options.title,

                area: options.area,

                closeBtn: options.closeBtn === undefined ? 1 : options.closeBtn,

                shadeClose: options.closeBtn === 0 ? true : false,

                content: options.content

            }

            if (options.url) {

                $.post(options.url, {}, function(str) { // url中如果包含参数，后台需要GET方式获取

                    layer_options.content = str;

                    layer.open(layer_options);

                });

            } else {

                layer.open(layer_options);

            }

        },



        // ajax提交并根据后台返回进行相应的操作

        // 输入参数

        // * url     : 目标地址

        // * content : 提交内容对象，如{a:a_value,b,b_value,...}, $("form").serialize()

        // * callback: 提交后的回调函数，默认缺省。参数为目标地址获取的data

        // AJAX返回的json对象，具有三个属性：

        // * data    : 一般设置为数据，例如返回地址，需要请求的内容

        // * info    : 返回的提示信息，可能为字符串，可能为数组

        // * status  : 返回状态。根据状态的不同，进行不同的操作

        //   		   0 显示错误信息，1 成功提示，2 成功提示并刷新，3 成功并跳转，4 成功并进行自定义操作



        ajaxSubmit: function(url, content, callback) {

            $.post(url, content, function(data) {

                // #1 返回数据检测

                // try {

                //     var data = data;

                // } catch (exception) {

                //     try {

                //         var data = eval("(" + data + ")"); 

                //     } catch(exception){

                //         layer.msg('接收数据格式错误，请检查数据库连接', { icon: 2 });

                //         return false;
                //     }
                // }

                if (!data) {

                    layer.msg("没有返回数据", { icon: 2 });

                    return false;

                }



                // #2 根据status状态进行相应操作



                // 0 错误提示

                // 如果后台输出数组，在相应位置显示信息

                // 如果所有信息的显示主体都是隐藏域，那么用msg方式显示其中一条

                if (data.status == 0) {

                    if (typeof(data.info) == 'object') {

                        var i = 0,
                            target = "";

                        for (var k in data.info) {

                            i++;

                            tar = "[name='" + k + "']";

                            if ($(tar).is(":visible")) { // 如果目标元素存在且没有隐藏则显示错误信息

                                layer.tips(data.info[k], tar, { tipsMore: true, tips: [2, '#393D49'] });

                            } else {

                                target = k;

                                i--;

                            }

                        }

                        i > 0 || layer.msg(data.info[target], { icon: 0 });

                    } else { // 否则直接输出提示信息

                        layer.msg(data.info, { icon: 0 });

                    }

                }

                // 1 成功提示/ 信息为空则不提示
                else if (data.status == 1) {

                    !data.info || layer.msg(data.info, { icon: 1 });

                }

                // 2 成功并刷新父窗口
                else if (data.status == 2) {

                    layer.msg(data.info, { icon: 1 }, function() {

                        parent.location.reload();

                    });

                }

                // 3 成功并跳转，如果有提示信息就显示
                else if (data.status == 3) {

                    if (data.info)

                        layer.msg(data.info, { icon: 1 }, function() {

                        window.location.href = data.data;

                    });

                    else

                        window.location.href = data.data;

                }

                // 4 成功后自定义操作，如果有提示信息就显示
                else if (data.status == 4) {

                    if (data.info)

                        layer.msg(data.info, { icon: 1 }, function() {

                        callback(data.data);

                    });

                    else

                        callback(data.data);

                } else {

                    layer.msg("未知状态，请检查代码", { icon: 2 });

                }

            }, 'json');

        },



        // AJAX分页

        // 输入参数: options 对象

        // * url      : AJAX请求地址

        // * target   : 分页容器JQuery对象

        // * template : 渲染数据的模板对象

        // * container: 显示数据容器JQuery对象

        // * before   : 获取提交参数的函数对象，返回键值对

        // * curr     : 当前页

        // AJAX返回的json对象，

        // * lists    : 数据列表

        // * allpage  : 总页数



        ajaxPage: function(options) {

            options = options || {};

            // 提交前搜集数据			

            param = typeof(options.before) === "function" ? options.before() : {};

            param.page = options.curr || 1; // 传入当前页参数

            $.getJSON(options.url, param, function(res) {

                // 使用laytpl渲染数据

                res.lists = res.lists || "none";

                var tpl = options.template.html();

                layui.laytpl(tpl).render(res, function(str) {

                    options.container.html(str);

                    layui.form().render();

                })



                //显示分页

                layui.laypage({

                    cont: options.target, //容器

                    pages: res.allpage, //通过后台拿到的总页数

                    curr: options.curr || 1, //当前页

                    jump: function(op, first) { //触发分页后的回调

                        if (!first) {

                            options.curr = op.curr; // 更新当前页

                            obj.ajaxPage(options);

                        }

                    }

                });

            });

        },



        // AJAX按模板渲染数据

        // 输入参数: options 对象

        // * url      : AJAX请求地址

        // * template : 渲染数据的模板对象

        // * container: 显示数据容器JQuery对象

        // * param    : 直接提供的提交参数对象

        // * before   : 获取提交参数的函数对象，返回键值对

        loadData: function(options) {

            options = options || {};

            // 1 获取请求参数

            p1 = options.param || {};

            p2 = typeof(options.before) === "function" ? options.before() : {};

            param = $.extend({}, p1, p2);



            // 2 发起请求

            $.getJSON(options.url, param, function(res) {

                // 3 使用laytpl渲染数据

                res.lists = res.lists || "none";

                var tpl = options.template.html();

                layui.laytpl(tpl).render(res, function(str) {

                    options.container.html(str);

                    layui.form().render();

                })

            });

        },



    };



    //输出test接口

    exports('common', obj);

});



/**

* 基于ueditor自定义上传组件

* 需要在ueditor.all.js文件me.execCommand('insertHtml', html);之后增加：me.fireEvent('afterUpfile', filelist);

*/

(function($) {

    $.fn.ueditor_upload = function(options) {

        // 默认参数

        var defaults = {

            editorid: null, // 百度编辑器容器

            uploadtype: 0, // 0 图片 1 文件

            title: '选择文件...', // 选择文件对话框的标题

            success: function() {} // 上传完成后的回调函数

        };



        // 初始化ueditor，并隐藏之

        function getEditor(editorid, tool) {

            return UE.getEditor(editorid, {

                isShow: false,

                focus: false,

                enableAutoSave: false,

                autoSyncData: false,

                autoFloatEnabled: false,

                wordCount: false,

                sourceEditor: null,

                scaleEnabled: true,

                toolbars: [
                    [tool]
                ]

            });

        };



        var o = $.extend(defaults, options || {});

        var me = null; // 当前被点击的对象

        if (o.uploadtype === 0) { // 上传图片

            var listener = 'beforeInsertImage';

            var dialogtype = 'insertimage';

            var tool = 'insertimage';

        } else { // 上传文件

            var listener = 'afterUpfile';

            var dialogtype = 'attachment';

            var tool = 'attachment';

        }



        // 初始化编辑器

        var editor = getEditor(o.editorid, tool);



        // 根据上传类型注册监听事件

        editor.ready(function() {

            editor.addListener(listener, function(t, args) {

                if (typeof(o.success) == 'function') {

                    o.success(me, args); // 回调函数

                }

            });

        });



        // 点击对象弹出上传对话框

        $(this).click(function(event) {

            me = $(this); // 获取被点击的对象，作为回调函数的参数

            var dialog = editor.getDialog(dialogtype);

            dialog.title = o.title;

            dialog.render();

            dialog.open();

        });

    }

})(jQuery);



/**

* 基于echarts的图表：

* @param target 目标容器id值

* @parame data json对象: [item:[,,,], data:[{name:,value:,},...]]

*/

function pie_chart(target, data) {

	if(data==null)
		return false;

    mc = echarts.init(document.getElementById(target));

    // 配置项和数据

    var option = {

        tooltip: {

            trigger: 'item',

            formatter: "{b} : {c} ({d}%)"

        },

        legend: {

            orient: 'horizontal',

            left: 'right',

            data: data.item

        },

        series: [

            {

                type: 'pie',

                radius: '55%',

                center: ['50%', '60%'],

                data: data.data,

                itemStyle: {

                    emphasis: {

                        shadowBlur: 10,

                        shadowOffsetX: 0,

                        shadowColor: 'rgba(0, 0, 0, 0.5)'

                    }

                }

            }

        ],

        color: ['#FF0F00', '#FF6600', '#FF9E01', '#FCD202', '#F8FF01', '#B0DE09', '#04D215', '#0D8ECF', '#0D52D1', '#2A0CD0', '#8A0CCF', '#CD0D74', '#754DEB', '#DDDDDD', '#999999', '#333333', '#57032A', '#CA9726', '#990000', '#4B0C25']

    };

    // 使用配置项和数据显示图表

    mc.setOption(option);

}


/**

 * 合并指定表格指定列的相同文本的相邻单元格：

 * @param table 需要进行合并单元格的表格

 * @parame colnum 需要合并单元格所在列, number, 1,2,3...

 */

function table_rowspan(table, colnum){
    table_firsttd = "";
    table_currenttd = "";
    table_SpanNum = 0;
    table_Obj = $(table + " tr td:nth-child(" + colnum + ")");
    table_Obj.each(function(i){
        if(i==0){
            table_firsttd = $(this);
            table_SpanNum = 1;
        }else{
            table_currenttd = $(this);
            if(table_firsttd.text()==table_currenttd.text()){
                table_SpanNum++;
                table_currenttd.hide(); //remove();
                table_firsttd.attr("rowSpan",table_SpanNum);
            }else{
                table_firsttd = $(this);
                table_SpanNum = 1;
            }
        }
    });
}

/**

 * 查看图片详情

 */
function initPhotoSwipeFromDOM(gallerySelector) {

    // 解析来自DOM元素幻灯片数据（URL，标题，大小...）
    // (children of gallerySelector)
    var parseThumbnailElements = function(el) {
        var thumbElements = el.childNodes,
            numNodes = thumbElements.length,
            items = [],
            figureEl,
            linkEl,
            size,
            item,
            divEl;

        for(var i = 0; i < numNodes; i++) {

            figureEl = thumbElements[i]; // <figure> element

            // 仅包括元素节点
            if(figureEl.nodeType !== 1) {
                continue;
            }
            divEl = figureEl.children[0];
            linkEl = divEl.children[0]; // <a> element

            size = linkEl.getAttribute('data-size').split('x');

            // 创建幻灯片对象
            item = {
                src: linkEl.getAttribute('href'),
                w: parseInt(size[0], 10),
                h: parseInt(size[1], 10)
            };



            if(figureEl.children.length > 1) {
                // <figcaption> content
                item.title = figureEl.children[1].innerHTML;
            }

            if(linkEl.children.length > 0) {
                // <img> 缩略图节点, 检索缩略图网址
                item.msrc = linkEl.children[0].getAttribute('src');
            }

            item.el = figureEl; // 保存链接元素 for getThumbBoundsFn
            items.push(item);
        }

        return items;
    };

    // 查找最近的父节点
    var closest = function closest(el, fn) {
        return el && ( fn(el) ? el : closest(el.parentNode, fn) );
    };

    // 当用户点击缩略图触发
    var onThumbnailsClick = function(e) {
        e = e || window.event;
        e.preventDefault ? e.preventDefault() : e.returnValue = false;

        var eTarget = e.target || e.srcElement;

        // find root element of slide
        var clickedListItem = closest(eTarget, function(el) {
            return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
        });

        if(!clickedListItem) {
            return;
        }

        // find index of clicked item by looping through all child nodes
        // alternatively, you may define index via data- attribute
        var clickedGallery = clickedListItem.parentNode,
            childNodes = clickedListItem.parentNode.childNodes,
            numChildNodes = childNodes.length,
            nodeIndex = 0,
            index;

        for (var i = 0; i < numChildNodes; i++) {
            if(childNodes[i].nodeType !== 1) {
                continue;
            }

            if(childNodes[i] === clickedListItem) {
                index = nodeIndex;
                break;
            }
            nodeIndex++;
        }



        if(index >= 0) {
            // open PhotoSwipe if valid index found
            openPhotoSwipe( index, clickedGallery );
        }
        return false;
    };

    // parse picture index and gallery index from URL (#&pid=1&gid=2)
    var photoswipeParseHash = function() {
        var hash = window.location.hash.substring(1),
            params = {};

        if(hash.length < 5) {
            return params;
        }

        var vars = hash.split('&');
        for (var i = 0; i < vars.length; i++) {
            if(!vars[i]) {
                continue;
            }
            var pair = vars[i].split('=');
            if(pair.length < 2) {
                continue;
            }
            params[pair[0]] = pair[1];
        }

        if(params.gid) {
            params.gid = parseInt(params.gid, 10);
        }

        return params;
    };

    var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
        var pswpElement = document.querySelectorAll('.pswp')[0],
            gallery,
            options,
            items;

        items = parseThumbnailElements(galleryElement);

        // 这里可以定义参数
        options = {
            barsSize: {
                top: 100,
                bottom: 100
            },
            fullscreenEl : true,
            shareButtons: false,

            // define gallery index (for URL)
            galleryUID: galleryElement.getAttribute('data-pswp-uid'),

            getThumbBoundsFn: function(index) {
                // See Options -> getThumbBoundsFn section of documentation for more info
                var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
                    pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
                    rect = thumbnail.getBoundingClientRect();

                return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
            }

        };

        // PhotoSwipe opened from URL
        if(fromURL) {
            if(options.galleryPIDs) {
                // parse real index when custom PIDs are used
                for(var j = 0; j < items.length; j++) {
                    if(items[j].pid == index) {
                        options.index = j;
                        break;
                    }
                }
            } else {
                // in URL indexes start from 1
                options.index = parseInt(index, 10) - 1;
            }
        } else {
            options.index = parseInt(index, 10);
        }

        // exit if index not found
        if( isNaN(options.index) ) {
            return;
        }

        if(disableAnimation) {
            options.showAnimationDuration = 0;
        }

        // Pass data to PhotoSwipe and initialize it
        gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
        gallery.init();
    };

    // loop through all gallery elements and bind events
    var galleryElements = document.querySelectorAll( gallerySelector );

    for(var i = 0, l = galleryElements.length; i < l; i++) {
        galleryElements[i].setAttribute('data-pswp-uid', i+1);
        galleryElements[i].onclick = onThumbnailsClick;
    }

    // Parse URL and open gallery if it contains #&pid=3&gid=1
    var hashData = photoswipeParseHash();
    if(hashData.pid && hashData.gid) {
        openPhotoSwipe( hashData.pid ,  galleryElements[ hashData.gid - 1 ], true, true );
    }
};
